package com.candy.service.impl;

import com.candy.dao.AccountDao;
import com.candy.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.Date;

/**
 * 曾经使用xml方式进行的配置：
 * <bean id="accountService" class="com.candy.service.impl.AccountServiceImpl" scope="singleton" init-method="initMethod" destroy-method="endMethod">
 *          <property name="name" value="" /ref=""></property>
 * </bean>
 * 按照上述配置，我们可以将配置的类型分为4类
 * 1、用于bean对象创建
 *      与xml配置文件中的bean标签的作用是一样的
 * 2、用于依赖注入的
 *      与xml配置文件中的property标签的作用是一样的
 * 3、用于改变作用范围的
 *      与xml配置文件中bean标签的scope属性的作用是一样的
 *4、与生命周期相关的
 *      与xml配置文件中bean标签的init-method/destroy-method属性的作用是一样的
 */

/**
 * @Transactional
 * 该注解的属性和 xml 中的属性含义一致。该注解可以出现在接口上，类上和方法上。出现接口上，表示该接口的所有实现类都有事务支持。
 * 出现在类上，表示类中所有方法有事务支持出现在方法上，表示方法有事务支持。
 * 以上三个位置的优先级：方法>类>接口
 */

@Service
@Scope("singleton")
@Transactional
public class AccountServiceImpl implements AccountService {
//成员变量
    @Value("张三")
    private  String name;
    @Value("25")
    private Integer age;
    private Date date;
    @Autowired
    @Qualifier("accountDaoImpl")
//    @Resource(name = "accountDaoImpl")
//    @Value("#{accountDaoImpl}")
    private AccountDao accountDao;
//无参构造
    public AccountServiceImpl() {
    }
//带有参数的构造函数，和我们使用构造函数进行注入值时指定的构造函数参数相同
    public AccountServiceImpl(String name, Integer age, Date date) {
        this.name = name;
        this.age = age;
        this.date = date;
    }



//转账


    @Override
    public void saveAccount(String innnerUser, String outterUser, Double money) {
        accountDao.subMoney(outterUser,money);
//        System.out.println(1/0);
        accountDao.addMoney(innnerUser,money);
    }

    public AccountDao getAccountDao() {
        return accountDao;
    }

    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    @PostConstruct
    public void initMethod(){
        System.out.println("对象初始化了。。。。。。");
    }

    @PreDestroy
    public void endMethod(){
        System.out.println("对象被销毁了");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "AccountServiceImpl{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", date=" + date +
                ", accountDao=" + accountDao +
                '}';
    }
}
